/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package nexus.criterios;

import java.util.ArrayList;
import java.util.HashMap;
import nexus.criterios.exp.Expresion;
/**
 *
 * @author Rodrigo
 */
public class CriterioEvaluacion{

    private ArrayList<CriterioEvaluacion> subcriterios;
    private CriterioCalificacion criterioCalificacion;
    private String codigoCriterio;
    private String nombreCriterio;
    private String formula;
    public CriterioEvaluacion(String codigoCriterio, String nombreCriterio) {
        this.codigoCriterio = codigoCriterio;
        this.nombreCriterio = nombreCriterio;
        subcriterios = new ArrayList<CriterioEvaluacion>();
    }
    
    public String getCodigoCriterio() {
        return codigoCriterio;
    }

    public void setCodigoCriterio(String codigoCriterio) {
        this.codigoCriterio = codigoCriterio;
    }

    public CriterioCalificacion getCriterioCalificacion() {
        return criterioCalificacion;
    }

    public void setCriterioCalificacion(CriterioCalificacion criterioCalificacion) {
        this.criterioCalificacion = criterioCalificacion;
    }

    public String getNombreCriterio() {
        return nombreCriterio;
    }

    public void setNombreCriterio(String nombreCriterio) {
        this.nombreCriterio = nombreCriterio;
    }

    public ArrayList<CriterioEvaluacion> getSubcriterios() {
        return subcriterios;
    }

    public void setSubcriterios(ArrayList<CriterioEvaluacion> subcriterios) {
        this.subcriterios = subcriterios;
    }
    
    public boolean tieneSubcriterios(){
        return subcriterios.size() > 0;
    }
    public boolean isConfigurado(){
        boolean res=false;
        if(tieneSubcriterios()){
           boolean hijosConfigurados=true;
           for(CriterioEvaluacion ce : subcriterios){
               if(!ce.isConfigurado()){
                   hijosConfigurados=false;
               }
           }
           if(formula!=null&&hijosConfigurados){
               res=true;
           }
        }else{
            if(criterioCalificacion!=null){
                res=true;
            }
        }
        return res;
    }
    public double minimoValor(){
        double minimo=0;
        if(criterioCalificacion!=null){
            minimo=criterioCalificacion.minimoValor();
        }else if(formula!=null){
            HashMap<String,Double> var=new HashMap<String,Double>();
            for(CriterioEvaluacion ce : subcriterios){
                if(ce.isConfigurado()){
                    var.put(ce.getNombreCriterio(),ce.minimoValor());
                }
            }
            Expresion exp=new Expresion(var, formula);
            try {
                minimo = exp.evaluar();
            } catch (Exception ex) {
            }
        }
        return minimo;
    }
    public double maximoValor(){
        double maximo=0;
        if(criterioCalificacion!=null){
            maximo=criterioCalificacion.maximoValor();
        }else if(formula!=null){
            HashMap<String,Double> var=new HashMap<String,Double>();
            for(CriterioEvaluacion ce : subcriterios){
                if(ce.isConfigurado()){
                    var.put(ce.getNombreCriterio(),ce.maximoValor());
                }
            }
            Expresion exp=new Expresion(var, formula);
            try {
                maximo = exp.evaluar();
            } catch (Exception ex) {
            }
        }
        return maximo;
    }
}
